
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxifecst12.h
/// @brief camxifecst12 class declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXIFECST12_H
#define CAMXIFECST12_H

// Camx includes
#include "camxformats.h"
#include "camxispiqmodule.h"
#include "camxsensorproperty.h"
#include "cst_1_2_0.h"
#include "titan170_ife.h"

// Common library includes
#include "iqcommondefs.h"

CAMX_NAMESPACE_BEGIN

CAMX_BEGIN_PACKED
/// @brief IFE CST12 Module Dependence Data
struct IFECST12RegCmd
{
    IFE_IFE_0_VFE_COLOR_XFORM_CH0_COEFF_CFG_0 ch0Coefficient0;        ///< CH0_COEFF_CFG_0
    IFE_IFE_0_VFE_COLOR_XFORM_CH0_COEFF_CFG_1 ch0Coefficient1;        ///< CH0_COEFF_CFG_1
    IFE_IFE_0_VFE_COLOR_XFORM_CH0_OFFSET_CFG  ch0OffsetConfig;        ///< CH0_OFFSET_CFG
    IFE_IFE_0_VFE_COLOR_XFORM_CH0_CLAMP_CFG   ch0ClampConfig;         ///< CH0_CLAMP_CFG
    IFE_IFE_0_VFE_COLOR_XFORM_CH1_COEFF_CFG_0 ch1CoefficientConfig0;  ///< CH1_COEFF_CFG_0
    IFE_IFE_0_VFE_COLOR_XFORM_CH1_COEFF_CFG_1 ch1CoefficientConfig1;  ///< CH1_COEFF_CFG_1
    IFE_IFE_0_VFE_COLOR_XFORM_CH1_OFFSET_CFG  ch1OffsetConfig;        ///< CH1_OFFSET_CFG
    IFE_IFE_0_VFE_COLOR_XFORM_CH1_CLAMP_CFG   ch1ClampConfig;         ///< CH1_CLAMP_CFG
    IFE_IFE_0_VFE_COLOR_XFORM_CH2_COEFF_CFG_0 ch2CoefficientConfig0;  ///< CH2_COEFF_CFG_0
    IFE_IFE_0_VFE_COLOR_XFORM_CH2_COEFF_CFG_1 ch2CoefficientConfig1;  ///< CH2_COEFF_CFG_1
    IFE_IFE_0_VFE_COLOR_XFORM_CH2_OFFSET_CFG  ch2OffsetConfig;        ///< CH2_OFFSET_CFG
    IFE_IFE_0_VFE_COLOR_XFORM_CH2_CLAMP_CFG   ch2ClampConfig;         ///< CH2_CLAMP_CFG
} CAMX_PACKED;

CAMX_END_PACKED

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class for IFE CST12 Module
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class IFECST12 final : public ISPIQModule
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Create
    ///
    /// @brief  Create IFECST12 Object
    ///
    /// @param  pCreateData Pointer to data for CTS Creation
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult Create(
        IFEModuleCreateData* pCreateData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Execute
    ///
    /// @brief  Generate Settings for CST12 Object
    ///
    /// @param  pInputData Pointer to the Inputdata
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult Execute(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetRegCmd
    ///
    /// @brief  Retrieve the buffer of the register value
    ///
    /// @return Pointer of the register buffer
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID* GetRegCmd();

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// IFECST12
    ///
    /// @brief  Constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    IFECST12();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~IFECST12
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~IFECST12();

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CheckDependenceChange
    ///
    /// @brief  Check if the Dependence Data has changed
    ///
    /// @param  pInputData Pointer to the Input Data
    ///
    /// @return TRUE if dependencies met
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL CheckDependenceChange(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// RunCalculation
    ///
    /// @brief  Perform the Interpolation and Calculation
    ///
    /// @param  pInputData Pointer to the CST Module Input data
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult RunCalculation(
        const ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CreateCmdList
    ///
    /// @brief  Generate the Command List
    ///
    /// @param  pInputData Pointer to the Input Data
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult CreateCmdList(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ModuleInitialize
    ///
    /// @brief  Initialize the Module Data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID ModuleInitialize();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SetupInitialConfig
    ///
    /// @brief  Configure some of the register value based on the chromatix and image format
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID SetupInitialConfig();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateIFEInternalData
    ///
    /// @brief  Update IFE internal data
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID UpdateIFEInternalData(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DumpRegConfig
    ///
    /// @brief  Print register configuration of Crop module for debug
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID DumpRegConfig();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// InitRegValues
    ///
    /// @brief  Initialize registers with known set of values
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_INLINE VOID InitRegValues();

    IFECST12(const IFECST12&)            = delete;      ///< Disallow the copy constructor
    IFECST12& operator=(const IFECST12&) = delete;      ///< Disallow assignment operator

    CST12InputData                  m_dependenceData;   ///< Dependence Data for this Module
    IFECST12RegCmd                  m_regCmd;           ///< Register List of this Module
    cst_1_2_0::chromatix_cst12Type* m_pChromatix;       ///< Pointer to tuning mode data
};

CAMX_NAMESPACE_END

#endif // CAMXIFECST12_H
